package com.project.class3_28;

import javax.swing.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ClassTest {
    public static void main(String[] args) {
//        Dog d1 = new Dog(3);
//        Dog d2 = new Dog(3);
//        System.out.println(d1 == d2);
//        //对象.getClass()得到该对象所在类的类模板Class对象
//        System.out.println(d1.getClass() == d2.getClass());
//        //1、类名.class
//        Class c1 = Dog.class;
//        //2、对象.getClass()
//        Class c2 = d1.getClass();
//        //3、Class.forName("类的全路径")（包名+类名）
//        Class c3 = null;
//        try {
//            c3 = Class.forName("com.project.class3_28.Dog");
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        System.out.println(c1 == c2);
//        System.out.println(c1 == c3);

//        Class c = Dog.class;
        //得到公有属性列表
//        Field[] fs = c.getFields();
        //得到该类中定义的属性列表，包括私有属性
//        Field[] fs = c.getDeclaredFields();
//        for (Field f : fs){
//            System.out.println(f.getName());
//        }

        //得到该类中所有的公有方法列表，包括继承的公有方法
//        Method[] ms = c.getMethods();
        //得到该类中定义的方法列表，包括私有方法，但不包括继承的方法
//        Method[] ms = c.getDeclaredMethods();
//        for (Method m : ms){
//            System.out.println(m.getName());
//        }

//        String str = JOptionPane.showInputDialog(null,"请输入全路径");
//        try {
//            Class c1 = Class.forName(str);
//            Method[] ms = c1.getMethods();
//            for (Method m : ms){
//                System.out.println(m.getName());
//            }
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }

        Class c = Dog.class;
        try {
            //调用该类的无参构造方法，产生该类的对象，等同于new
//            Object obj = c.getConstructor().newInstance();
//            System.out.println(obj);
//            System.out.println(obj instanceof Dog);

            Object obj = c.getConstructor(int.class).newInstance(3);
            Dog dog = (Dog) obj;
            System.out.println(dog.age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class Dog{
    public int age;
    private String name;

    public Dog(int age) {
        this.age = age;
        System.out.println("产生有年龄的狗");
    }

    public Dog() {
        System.out.println("产生狗");
    }

    public void run(){
        System.out.println("run");
    }

    private void sleep(){
        System.out.println("sleep");
    }
}
